package com.gel.codegeneration.ai;

import com.gel.codegeneration.ai.model.entity.HtmlCodeResult;
import com.gel.codegeneration.ai.model.entity.MultiFileResult;
import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.TokenStream;
import dev.langchain4j.service.UserMessage;
import reactor.core.publisher.Flux;

public interface AiCodeGenerationService {

    /**
     * 生成HTML代码
     *
     * @param userMessage 用户输入
     * @return 生成的HTML代码
     */
    @SystemMessage(fromResource = "prompt/html-system-prompt.txt")
    HtmlCodeResult generateHtmlCode( @UserMessage String userMessage);

    /**
     * 生成多个文件代码
     *
     * @param userMessage 用户输入
     * @return 生成的多个文件代码
     */
    @SystemMessage(fromResource = "prompt/multi-file-system-prompt.txt")
    MultiFileResult generateMultiFileCode(@UserMessage String userMessage);

    /**
     * 生成HTML代码流式输出
     *
     * @param userMessage 用户输入
     * @return 生成的HTML代码
     */
    @SystemMessage(fromResource = "prompt/html-system-prompt.txt")
    Flux<String> generateHtmlCodeStream(@UserMessage String userMessage);

    /**
     * 生成多个文件代码流式输出
     *
     * @param userMessage 用户输入
     * @return 生成的多个文件代码
     */
    @SystemMessage(fromResource = "prompt/multi-file-system-prompt.txt")
    Flux<String> generateMultiFileCodeStream(@UserMessage String userMessage);

    /**
     * 生成Vue项目代码流式输出
     *  gel
     * @param appId 应用id作为记忆id，同时作为tool调用id, userMessage
     * @return reactor.core.publisher.Flux<java.lang.String>
     **/
    @SystemMessage(fromResource = "prompt/vue_project-system-prompt.txt")
    TokenStream generateVueProjectCodeStream(@MemoryId Long appId, @UserMessage String userMessage);

}
